package com.app.web.base.util;

import java.util.Map;

import javax.faces.context.FacesContext;

import org.springframework.beans.factory.ObjectFactory;
import org.springframework.beans.factory.config.Scope;

/**
 * Project: erp<br>
 * Description: 整合jsf的ViewScope生命周期<br>
 * Copyright (c) 2012<br>
 * All Rights Reserved.<br>
 * @author <a href="mailto:gly420@163.com">GuanLuYong</a><br>
 * 
 * Spring Scope:<br>
 * 1、singleton：不限于web，不是普通意义上的单例，容器惟一<br>
 * 2、prototype：不限于web，每次请求生成新的bean<br>
 * <br>
 * 3、request：只限于web。为每个HTTP请求创建一个全新的RequestPrecessor对象，当请求结束后，该对象的生命周期即告结束。<br>
 * 4、session：只限于web。Spring容器会为每个独立的session创建属于自己的全新的UserPreferences实例。<br>
 * 5、global session：(globalsession)只限于web。<br>
 * global session只有应用在基于porlet的web应用程序中才有意义，他映射到porlet的global范围的session，<br>
 * 如果普通的servlet的web 应用中使用了这个scope，容器会把它作为普通的session的scope对待。<br>
 * <br>
 * 6、view：自定义的Scope，对应于jsf的ViewScope生命周期。<br>
 */
public class ViewScope implements Scope {

	@Override
	public String getConversationId() {
		return null;
	}

	@Override
	public void registerDestructionCallback(String arg0, Runnable arg1) {
		
	}

	@Override
	public Object remove(String arg0) {
		return FacesContext.getCurrentInstance().getViewRoot().getViewMap().remove(arg0);
	}

	@Override
	public Object resolveContextualObject(String arg0) {
		return null;
	}

	@Override
	public Object get(String arg0, ObjectFactory<?> arg1) {
		Map<String, Object> viewMap = FacesContext.getCurrentInstance().getViewRoot().getViewMap();
		if (viewMap.containsKey(arg0)) {
			return viewMap.get(arg0);
		} else {
			Object object = arg1.getObject();
			viewMap.put(arg0, object);
			return object;
		}
	}
}
